﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Infragistics.Win.UltraWinGrid;
using Infragistics.Win;


namespace RDD
{
    public partial class RegiRemi : Form
    {
        private estadoPantalla _Estado = estadoPantalla.Consultar;
        public estadoPantalla Estado
        {
            get { return _Estado; }
            set
            {
                _Estado = value;
                switch (value)
                {
                    case estadoPantalla.Consultar:
                        #region Estado Consultar
                        deshabilitarControles();
                        lblEstado.Text = "Estado Pantalla : Consulta";
                        break;
                        #endregion
                    case estadoPantalla.Editar:
                        #region Estado Editar
                        habilitarControles();
                        lblEstado.Text = "Estado Pantalla : Editando";
                        txtFecha.Focus();
                        break;
                        #endregion
                    case estadoPantalla.Insertar:
                        #region Estado Insertar
                        habilitarControles();
                        lblEstado.Text = "Estado Pantalla : Insertando";
                        txtRemisionID.Focus();
                        break;
                        #endregion
                }
            }
        }

        //Declarar variables de la forma
        private DataSet dsGridDatos = new DataSet();
        Remision mRemision = new Remision();
        bool mListoGrid = false;
        private bool datosValidos = true;
        bool tEncontroNodo = false;
        string tFiltroAgenciaActual;

        #region Metodos Publicos
        public RegiRemi()
        {
            InitializeComponent();
        }
        public void buscarNodo()
        {
            foreach (TreeNode tNodo in trvItems.Nodes)
            {
                //Buscar importacion por valor
                tEncontroNodo = false;
                trvItems.SelectedNode = tNodo.Nodes[txtBuscar.Text];
                if (trvItems.SelectedNode != null)
                {
                    tEncontroNodo = true;
                    break;
                }
            }
            if (!tEncontroNodo)
            {
                MessageBox.Show("No se encontró el número de Póliza de Exportación : " + txtBuscar.Text, "RDD - Pólizas de Exportación");
            }
        }
        #endregion Metodos Publicos

        #region Metodos privados
        private void adicionarNodoNuevo()
        {
            trvItems.Nodes[trvItems.Nodes.Count - 1].Nodes.Add("Nueva", "Nueva", 7, 8);
            trvItems.SelectedNode = trvItems.Nodes[trvItems.Nodes.Count - 1].LastNode;
        }
        private void asignarPropiedades()
        {
            mRemision.RemisionID = txtRemisionID.Value.ToString();
            mRemision.Fecha = Convert.ToDateTime(txtFecha.Value);
            mRemision.AgenciaID = ddlAgencia.Value.ToString();
            mRemision.Observ = txtObservacion.Text;
        }
        private void configurarGrid()
        {
            #region Import
            //Grid del detalle de las Importaciones
            UltraGridBand banda0 = grdDatos.DisplayLayout.Bands["Import"];
            banda0.Override.HeaderAppearance.TextHAlign = Infragistics.Win.HAlign.Center;
            //Numero de Importacion
            banda0.Columns["ImportID"].Width = 80;
            banda0.Columns["Fecha"].Width = 80;
            banda0.Columns["Fecha"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DateWithoutDropDown;
            //Valor colones de la imporacion
            banda0.Columns["Valor"].Width = 100;
            banda0.Columns["Valor"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DoubleNonNegative;
            banda0.Columns["Valor"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
            banda0.Columns["Valor"].Format = "###,##0.00";

            //Total cajas importadas 
            banda0.Columns["Importadas"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.IntegerPositive;
            banda0.Columns["Importadas"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
            banda0.Columns["Importadas"].Format = "###,##0";
            //Saldo de cajas importadas 
            banda0.Columns["Saldo"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.IntegerPositive;
            banda0.Columns["Saldo"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
            banda0.Columns["Saldo"].Format = "###,##0";
            banda0.Columns["Saldo"].Width = 80;
            //Columna Incluir
            banda0.Columns["Incluir"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.CheckBox;
            banda0.Columns["Incluir"].DefaultCellValue = false;
            banda0.Columns["Incluir"].Width = 70;
            #endregion Import

            #region Facturas
            UltraGridBand banda1 = grdDatos.DisplayLayout.Bands["RelacionImport"];
            banda1.Override.HeaderAppearance.TextHAlign = Infragistics.Win.HAlign.Center;
            //Numero de Importacion
            banda1.Columns["ImportID"].Hidden = true;
            banda1.Columns["Fecha"].Width = 100;
            banda1.Columns["Fecha"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DateWithoutDropDown;

            //Total cajas importadas 
            banda1.Columns["TotalCajas"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.IntegerPositive;
            banda1.Columns["TotalCajas"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
            banda1.Columns["TotalCajas"].Format = "###,##0";
            banda1.Columns["TotalCajas"].Header.Caption = "CAJAS";
            #endregion Facturas
        }
        private void deshabilitarControles()
        {
            //No permitir modificar el contenido de los controles
            txtRemisionID.Enabled = false;
            txtFecha.Enabled = false;
            ddlAgencia.Enabled = false;
            txtObservacion.Enabled = false;
            //No puede insertar filas o modificar los valores del grid
            grdDatos.DisplayLayout.Override.AllowUpdate = Infragistics.Win.DefaultableBoolean.False;
            grdDatos.DisplayLayout.Bands["Import"].Columns["Incluir"].Hidden = true;
            //En caso de estar visible una nueva fila sin datos, se elimina
            btnEditar.Enabled = true;
            btnSalvar.Enabled = false;
            btnBorrar.Enabled = true;
            btnInsertar.Enabled = true;
            btnCancelar.Enabled = false;
        }
        private void habilitarControles()
        {
            //Permite modificar el contenido de los controles
            if (Estado == estadoPantalla.Insertar)
            {
                txtRemisionID.Enabled = true;
                //Activar  grid solo en la celda Incluir
                grdDatos.DisplayLayout.Override.AllowUpdate = Infragistics.Win.DefaultableBoolean.Default;
                grdDatos.DisplayLayout.Bands[0].Columns["Incluir"].CellActivation = Activation.AllowEdit;
                grdDatos.DisplayLayout.Bands[0].Columns["Incluir"].Hidden = false;
                grdDatos.DisplayLayout.Bands[0].Columns["ImportID"].CellActivation = Activation.ActivateOnly;
                grdDatos.DisplayLayout.Bands[0].Columns["Fecha"].CellActivation = Activation.ActivateOnly;
                grdDatos.DisplayLayout.Bands[0].Columns["Valor"].CellActivation = Activation.ActivateOnly;
                grdDatos.DisplayLayout.Bands[0].Columns["Importadas"].CellActivation = Activation.ActivateOnly;
                grdDatos.DisplayLayout.Bands[0].Columns["Saldo"].CellActivation = Activation.ActivateOnly;
            }
            txtFecha.Enabled = true;
            ddlAgencia.Enabled = true;
            txtObservacion.Enabled = true;
            btnEditar.Enabled = false;
            btnSalvar.Enabled = true;
            btnBorrar.Enabled = false;
            btnInsertar.Enabled = false;
            btnCancelar.Enabled = true;
        }
        private void limpiarControles()
        {
            //Inicializa valores de los controles
            //Para cada control en la forma, asignar el valor de la propiedad
            txtRemisionID.Value = 0;
            txtFecha.Value = DateTime.Today;
            txtObservacion.Text = "";
            //Borrar datos del grid
            if (dsGridDatos.Tables.Count > 1)
            {
                dsGridDatos.Tables[1].Rows.Clear();
                dsGridDatos.Tables[0].Rows.Clear();
            }
            else if (dsGridDatos.Tables.Count > 0)
            {
                dsGridDatos.Tables[0].Rows.Clear();
            }
            grdDatos.DataSource = dsGridDatos;
        }
        private void llenarArbol()
        {
            this.Cursor = Cursors.WaitCursor;
            try
            {
                int tAnno = 0;
                int tIndice = -1;
                int tImgIndex;
                string tKey;
                DataTable tDatos = mRemision.leerRegistros(Valores.gCiaCod,ddlFiltroAgencia.ComboBox.SelectedValue.ToString());
                //Mostrarlas en el arbol
                if (tDatos.Rows.Count > 0)
                {
                    lblTotReg.Text = tDatos.Rows.Count + " registros";
                    trvItems.Nodes.Clear();
                    foreach (DataRow tFila in tDatos.Rows)
                    {
                        if (tAnno != Convert.ToInt16(tFila["Anno"]))
                        {
                            //Insertar nuevo nodo principal de año
                            tAnno = Convert.ToInt16(tFila["Anno"]);
                            tKey = tAnno.ToString();
                            trvItems.Nodes.Add(new TreeNode(tKey, 0, 0));
                            tIndice += 1;
                        }
                        //Adicionar nodo del numero de importacion
                        tKey = tFila["RemisionID"].ToString().TrimEnd();
                        tImgIndex = 5;
                        trvItems.Nodes[tIndice].Nodes.Add(tKey, tKey, tImgIndex, tImgIndex + 1);
                    }
                    trvItems.SelectedNode = trvItems.Nodes[tIndice].LastNode;
                    tFiltroAgenciaActual = ddlFiltroAgencia.ComboBox.SelectedValue.ToString();
                }
                else
                {
                    MessageBox.Show("No existen Remisiones en esta compañia. Operación cancelada.", "RDD - Registro de Remisión");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un error llenando las Remisiones : " + ex.Message, "RDD - Registro de Remisión");
            }
            finally
            { this.Cursor = Cursors.Default; }
        }
        private void llenarListas()
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                //Llenar lista de agencias
                DataTable tDatos = new DataTable();
                tDatos = Valores.LlenarListaTabla("AGENCIA", "AgenciaID", "AgenciaID", "");
                ddlAgencia.DataSource = tDatos;
                ddlAgencia.DisplayMember = "AgenciaID";
                ddlAgencia.ValueMember = "AgenciaID";

                List<miComboItem> listaDatos = new List<miComboItem>();
                foreach (DataRow tFila in tDatos.Rows)
                {
                    listaDatos.Add(new miComboItem(tFila["AgenciaID"].ToString(), tFila["AgenciaID"].ToString()));
                }
                //Llenar lista de filtro por estados, adicionar primero el item Todos
                listaDatos.Insert(0, new miComboItem("T", "Todas"));
                ddlFiltroAgencia.ComboBox.DataSource = listaDatos;
                ddlFiltroAgencia.ComboBox.ValueMember = "valor";
                ddlFiltroAgencia.ComboBox.DisplayMember = "texto";
                ddlFiltroAgencia.SelectedIndex = -1;
                ddlFiltroAgencia.ComboBox.SelectedValue = "T";
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al mostrar lista de valores : " + ex.Message, Constantes.RDD, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }
        private void mostrarRegistro()
        {
            //Para cada control en la forma, asignar el valor de la propiedad
            txtRemisionID.Value = mRemision.RemisionID;
            txtFecha.Value = mRemision.Fecha;
            ddlAgencia.Value = mRemision.AgenciaID;
            txtObservacion.Text = mRemision.Observ;
            //Leer registro del detalle y asignarlo al datatable asociado al grid
            if (dsGridDatos.Tables.Count > 1)
            {
                dsGridDatos.Tables[1].Rows.Clear();
                dsGridDatos.Tables[0].Rows.Clear(); 
            }
            else if (dsGridDatos.Tables.Count > 0)
            {
                dsGridDatos.Tables[0].Rows.Clear();
            }
            dsGridDatos = mRemision.leerDetalle();
            grdDatos.DataSource = dsGridDatos;
            if (!mListoGrid)
            {
                //Si no se ha configurado el grid debe hacerse
                configurarGrid();
            }
            //Mostrar detalle de importaciones
            //grdDatos.DisplayLayout.Bands["RelacionImport"].Hidden = (mRemision.TotalCajas == 0);
            this.Estado = estadoPantalla.Consultar;
        }        
        public void refrescar()
        {
            //Llena el arbol con los parametros actuales
            mListoGrid = false;
            //Mostrar todas
            if (ddlFiltroAgencia.ComboBox.SelectedValue.ToString() != "T")
            { ddlFiltroAgencia.ComboBox.SelectedValue = "T"; }
            else
            {
                llenarArbol();
            }
            this.Text = "Registro de Remisión - " + Valores.gCiaNom;
        }
        /// <summary>
        /// Refresscar los datos en las pantallas de polizas de importacion y de las facturas de exportacion
        /// </summary>
        private void refrescarTodos()
        {
            MDIPrincipal tForma = ((MDIPrincipal)this.ParentForm);
            if (tForma.fRegiImpo != null && !tForma.fRegiImpo.IsDisposed)
            { tForma.fRegiImpo.refrescar(); }
            if (tForma.fFactExpo != null && !tForma.fFactExpo.IsDisposed)
            { tForma.fFactExpo.refrescar(); }
        }
        private bool validarDatos()
        {
            //Validar datos del registro encabezado
            string tMensaje = "";
            object tControl = new object();
            //Numero de importacion
            if (txtRemisionID.Value.ToString().Length == 0)
            {
                tMensaje = "La Identificación de la remisión es obligatorio. Favor ingresar un valor";
                txtRemisionID.Focus();
            }
            else if (Convert.ToDateTime(txtFecha.Value) > DateTime.Today)
            {
                tMensaje = "Fecha de Remisión mayor que fecha actual. Favor ingresar fecha válida";
                txtFecha.Focus();
            }
            if (tMensaje.Length > 0)
            {
                MessageBox.Show("Error : " + tMensaje, "Registro de Remisión", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            else
            {
                return true;
            }
        }
        #endregion Metodos privados

        #region Eventos
        private void btnBorrar_Click(object sender, EventArgs e)
        {
            DialogResult mensaje = MessageBox.Show("Se va a borrar el Registro de Remisión ID : " + mRemision.RemisionID + " ¿Esta seguro?", "Registro de Remisión", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
            if (mensaje == DialogResult.Yes)
            {
                try
                {
                    mRemision.borrarRegistro();
                    //trvItems.SelectedNode.Remove();
                    llenarArbol();
                    //trvItems.SelectedNode = trvItems.Nodes[trvItems.Nodes.Count - 1].LastNode;
                    MessageBox.Show("El registro de remisión fue borrado exitosamente.", "RDD - Borrar Remisión", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(Constantes.FALLA + ex.Message, Constantes.RDD, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (Estado == estadoPantalla.Insertar)
            {
                //Borrar nodo nuevo del arbol
                trvItems.SelectedNode.Remove();
                Estado = estadoPantalla.Consultar;
                trvItems.SelectedNode = trvItems.Nodes[trvItems.Nodes.Count - 1].LastNode;
            }
            else
            {
                //Cancelar edicion
                mostrarRegistro();
            }
        }
        private void btnEditar_Click(object sender, EventArgs e)
        {
            //Habilitar los campos para edicion
            Estado = estadoPantalla.Editar;
        }
        private void btnInsertar_Click(object sender, EventArgs e)
        {
            DataSet tDatos = new DataSet();
            //Validar si hay remisiones Verificadas, listas para remitir
            tDatos = mRemision.leerImportVerificadas();
            if (tDatos.Tables[0].Rows.Count > 0)
            {
                //Insertar nuevo registro
                limpiarControles();
                adicionarNodoNuevo();
                Estado = estadoPantalla.Insertar;
                //mostrar en el detalle las importaciones a remitir
                
                //Borrar datos del dataset de la forma
                if (dsGridDatos.Tables.Count > 1)
                {
                    dsGridDatos.Tables[1].Rows.Clear();
                    dsGridDatos.Tables[0].Rows.Clear();
                }
                else if (dsGridDatos.Tables.Count > 0)
                {
                    dsGridDatos.Tables[0].Rows.Clear();
                }
                dsGridDatos = tDatos;
                grdDatos.DataSource = dsGridDatos;
            }
            else
            {
                MessageBox.Show("No hay Importaciones listas para remitir. No se puede inserter una remisión.", "Registro de Remisión", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }         
        private void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                //Validar datos de la maestra
                if (validarDatos())
                {
                    //Salvar los cambios en el grid, si hay
                    datosValidos = true;
                    grdDatos.UpdateData();
                    if (datosValidos)
                    {
                        asignarPropiedades();
                        mRemision.FechModi = DateTime.Now;
                        mRemision.UsuaModi = Valores.USUARIO;
                        DataTable dtGridDatos = dsGridDatos.Tables["Import"];
                        if (Estado == estadoPantalla.Insertar)
                        {
                            if (mRemision.insertarRegistro(dtGridDatos))
                            {
                                //Volver a crear el arbol
                                txtBuscar.Text = txtRemisionID.Value.ToString();
                                Estado = estadoPantalla.Consultar;
                                llenarArbol();
                                buscarNodo();
                            }
                        }
                        else if (Estado == estadoPantalla.Editar)
                        {
                            mRemision.actualizarRegistro(dtGridDatos);
                            mostrarRegistro();
                        }
                        //Volver a estado Consulta
                        MessageBox.Show(Constantes.EXITOSO + " Cambios salvados. ", "Salvar Cambios", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un Error al salvar el registro." + ex.Message, "Registro de Remisión", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally
            { this.Cursor = Cursors.Default; }
        }
        private void cmdBuscar_Click(object sender, EventArgs e)
        {
            buscarNodo();
        }
        private void cmdCancelar_Click(object sender, EventArgs e)
        {
            if (Estado == estadoPantalla.Insertar)
            {
                //Borrar nodo nuevo del arbol
                trvItems.SelectedNode.Remove();
                Estado = estadoPantalla.Consultar;
                trvItems.SelectedNode = trvItems.Nodes[trvItems.Nodes.Count - 1].LastNode;
            }
            else
            {
                //Cancelar edicion
                mostrarRegistro();
            }
        }
        private void mnuImprimir_Click(object sender, EventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;
            try
            {
                //preRelFacImp rep = new preRelFacImp(mExpo.CiaCod, mExpo.RemisionID);
                //rep.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "RDD - Imprimir Factura ");
            }
            finally
            { this.Cursor = Cursors.Default; }
        }
        private void RegiRemi_Load(object sender, EventArgs e)
        {
            this.trvItems.ImageList = ((MDIPrincipal)this.ParentForm).imlImagenes;
            llenarListas();
            //Llenar arbol
            llenarArbol();
            this.Text = "Registro de Remisión - " + Valores.gCiaNom;
        }
        private void trvItems_AfterSelect(object sender, TreeViewEventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;
            try
            {
                if (e.Node.FullPath.Length > 4 && e.Node.Text != "Nueva")
                {
                    //Mostrar los valores de la importacion seleccionda
                    string tID = trvItems.SelectedNode.Text;
                    mRemision.leerRegistro(Valores.gCiaCod, tID);
                    mostrarRegistro();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un error al seleccionar la poliza : " + ex.Message, "RDD - Registro de Remisión",MessageBoxButtons.OK,MessageBoxIcon.Information);
            }
            finally
            { this.Cursor = Cursors.Default; }
        }
        private void trvItems_BeforeSelect(object sender, TreeViewCancelEventArgs e)
        {
            tEncontroNodo = true;
            if (Estado != estadoPantalla.Consultar && e.Node.FullPath.Length > 4)
            {
                DialogResult mensaje = MessageBox.Show("Los cambios no se han salvado. ¿Desea realmente salir?", "Registro de Remisión", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
                if (mensaje == DialogResult.No)
                {
                    e.Cancel = true;
                }
                else if (Estado == estadoPantalla.Insertar)
                {
                    //Borrar el nodo acual
                    trvItems.SelectedNode.Remove();
                }
            }
        }
        private void txtRemisionID_Enter(object sender, EventArgs e)
        {
            txtRemisionID.SelectAll();
        }
        private void txtFecha_Enter(object sender, EventArgs e)
        {
            txtFecha.SelectAll();
        }
        #endregion Eventos

        private void mnuImprimir_Click_1(object sender, EventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;
            try
            {
                Valores.gRemisionID = txtRemisionID.Text;
                //Mostrar Forma con el reporte
                frmVistaPrevia fReporte = new frmVistaPrevia(5);
                fReporte.ShowDialog();
                fReporte.WindowState = FormWindowState.Normal;
                fReporte.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un error al cargar reporte: " + ex.Message, "RDD - Reporte de Remisión");
            }
            finally
            { this.Cursor = Cursors.Default; }
        }

        private void ddlFiltroAgencia_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ddlFiltroAgencia.SelectedIndex >= 0 && ddlFiltroAgencia.ComboBox.ValueMember.Length > 0)
            {
                if (ddlFiltroAgencia.ComboBox.SelectedValue.ToString() != tFiltroAgenciaActual)
                { llenarArbol(); }
                ddlFiltroAgencia.ComboBox.SelectedValue = tFiltroAgenciaActual;
                return;
            }
        }
    }
}
